From 5cfc4fb629794ad2b244e9ef840e2fc2fa251845 Mon Sep 17 00:00:00 2001 From: David Tolnay Date: Thu, 1 Sep 2016 10:29:24 -0700 Subject: [PATCH] Test for rustc-macro --- tests/rustc-macro.rs | 146 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 146 insertions(+) create mode 100644 tests/rustc-macro.rs diff --git a/tests/rustc-macro.rs b/tests/rustc-macro.rs new file mode 100644 index 000000000..fe49b359d --- /dev/null +++ b/tests/rustc-macro.rs @@ -0,0 +1,146 @@ +extern crate cargotest; +extern crate hamcrest; + +use cargotest::is_nightly; +use cargotest::support::{project, execs}; +use hamcrest::assert_that; + +#[test] +fn noop() { + if !is_nightly() { + return; + } + + let client = project("client") + .file("Cargo.toml", r#" + [package] + name = "client" + version = "0.0.1" + authors = [] + + [dependencies.noop] + path = "../noop" + "#) + .file("src/main.rs", r#" + #![feature(rustc_macro)] + + #[macro_use] + extern crate noop; + + #[derive(Noop)] + struct X; + + fn main() {} + "#); + let noop = project("noop") + .file("Cargo.toml", r#" + [package] + name = "noop" + version = "0.0.1" + authors = [] + + [lib] + rustc-macro = true + "#) + .file("src/lib.rs", r#" + #![feature(rustc_macro, rustc_macro_lib)] + + extern crate rustc_macro; + use rustc_macro::TokenStream; + + #[rustc_macro_derive(Noop)] + pub fn noop(input: TokenStream) -> TokenStream { + input + } + "#); + noop.build(); + + assert_that(client.cargo_process("build"), + execs().with_status(0)); + assert_that(client.cargo("build"), + execs().with_status(0)); +} + +#[test] +fn impl_and_derive() { + if !is_nightly() { + return; + } + + let client = project("client") + .file("Cargo.toml", r#" + [package] + name = "client" + version = "0.0.1" + authors = [] + + [dependencies.transmogrify] + path = "../transmogrify" + "#) + .file("src/main.rs", r#" + #![feature(rustc_macro)] + + #[macro_use] + extern crate transmogrify; + + trait ImplByTransmogrify { + fn impl_by_transmogrify(&self) -> bool; + } + + #[derive(Transmogrify)] + struct X; + + fn main() { + let x = X::new(); + assert!(x.impl_by_transmogrify()); + println!("{:?}", x); + } + "#); + let transmogrify = project("transmogrify") + .file("Cargo.toml", r#" + [package] + name = "transmogrify" + version = "0.0.1" + authors = [] + + [lib] + rustc-macro = true + "#) + .file("src/lib.rs", r#" + #![feature(rustc_macro, rustc_macro_lib)] + + extern crate rustc_macro; + use rustc_macro::TokenStream; + + #[rustc_macro_derive(Transmogrify)] + #[doc(hidden)] + pub fn transmogrify(input: TokenStream) -> TokenStream { + assert_eq!(input.to_string(), "struct X;\n"); + + " + impl X { + fn new() -> Self { + X { success: true } + } + } + + impl ImplByTransmogrify for X { + fn impl_by_transmogrify(&self) -> bool { + true + } + } + + #[derive(Debug)] + struct X { + success: bool, + } + ".parse().unwrap() + } + "#); + transmogrify.build(); + + assert_that(client.cargo_process("build"), + execs().with_status(0)); + assert_that(client.cargo("run"), + execs().with_status(0).with_stdout("X { success: true }")); +} -- 2.30.2